import {
  Entity,
  PrimaryGeneratedColumn,
  Column,
  BeforeInsert,
  Index,
  ManyToMany,
  JoinTable
} from 'typeorm';
import { Role } from './role.entity';

@Entity('tb_user')
export class User {
  /** 普通用户唯一ID，自增（如10001、10002...），用于内部关联订单 */
  @PrimaryGeneratedColumn('increment', {
    type: 'bigint',
    comment: '普通用户唯一ID，自增（如10001、10002...），用于内部关联订单'
  })
  user_id: number;

  /** 账号，用于后台登录 */
  @Column({
    type: 'varchar',
    length: 50,
    unique: true,
    comment: '账号，用于后台登录'
  })
  account: string;

  /** 密码（加密存储） */
  @Column({
    type: 'varchar',
    length: 100,
    select: false,
    comment: '密码（加密存储）'
  })
  password: string;

  /** 普通用户手机号，微信登录后获取，作为匹配订单的核心标识（与经销商手机号唯一不重复） */
  @Column({
    type: 'varchar',
    length: 11,
    nullable: true,
    comment:
      '普通用户手机号，微信登录后获取，作为匹配订单的核心标识（与经销商手机号唯一不重复）'
  })
  @Index({ unique: true })
  user_phone: string;

  /** 普通用户姓名（可空，后续用户填写或定制参数补充，或经销商登记订单时录入） */
  @Column({
    type: 'varchar',
    length: 50,
    nullable: true,
    comment:
      '普通用户姓名（可空，后续用户填写或定制参数补充，或经销商登记订单时录入）'
  })
  user_name?: string;

  /** 微信用户唯一标识（微信登录后获取），用于小程序自动登录关联用户 */
  @Column({
    type: 'varchar',
    length: 64,
    unique: true,
    comment: '微信用户唯一标识（微信登录后获取），用于小程序自动登录关联用户'
  })
  wechat_openid: string;

  /** 微信昵称（可空，用于小程序界面显示，提升用户体验） */
  @Column({
    type: 'varchar',
    length: 100,
    nullable: true,
    comment: '微信昵称（可空，用于小程序界面显示，提升用户体验）'
  })
  wechat_nickname?: string;

  /** 微信头像URL（可空，用于小程序个人中心显示） */
  @Column({
    type: 'varchar',
    length: 255,
    nullable: true,
    comment: '微信头像URL（可空，用于小程序个人中心显示）'
  })
  user_avatar?: string;

  /** 用户首次登录小程序的注册时间，如“2024-05-02 14:15:00” */
  @Column({
    type: 'bigint',
    nullable: true,
    comment: '用户首次登录小程序的注册时间，如“2024-05-02 14:15:00”'
  })
  register_time: number;

  /** 用户最后一次登录小程序的时间，登录时自动刷新 */
  @Column({
    type: 'bigint',
    nullable: true,
    comment: '用户最后一次登录小程序的时间，登录时自动刷新'
  })
  last_login_time: number;

  /** 备注信息（如“2024-05-02 上海经销商付定金”） */
  @Column({
    type: 'varchar',
    length: 500,
    nullable: true,
    comment: '备注信息（如“2024-05-02 上海经销商付定金”）'
  })
  remark?: string;

  /** 用户角色列表（多角色支持，如普通用户、经销商、管理员等） */
  @ManyToMany(() => Role)
  @JoinTable({
    name: 'tb_user_role', // 关联表名
    joinColumn: {
      name: 'user_id',
      referencedColumnName: 'user_id',
    },
    inverseJoinColumn: {
      name: 'role_id',
      referencedColumnName: 'id',
    },
  })
  roles: Role[];

  @BeforeInsert()
  beforeInsert() {
    this.register_time = Date.now();
    this.last_login_time = Date.now();
  }
}
